import http from 'axios'
import qs from 'qs'
import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user.js'

// 配置axios基本属性
http.defaults.baseURL = import.meta.env.VITE_API_URL // 从.env中获取基础url,所有请求都会加上该url -> '/api'
http.defaults.timeout = 10000 // 设置请求超时时间为10s

// 数据上传数据类型 -> 用于设置Content-Type头部
http.upType = {
  form: 0, // 表单类型
  json: 1, // json类型
  file: 3, // 文件类型
  stream: 4 // 文件流类型
}

// HTTP状态码
http.httpcode = {
  FAIL: 0,
  SUCCESS: 1
  // UNAUTHORIZED: 401, // 暂未登录或TOKEN已经过期 -> 跳转到登录页
  // FORBIDDEN: 403, //没有相关权限
  // NOT_FOUND: 404, //访问页面未找到
  // SERVER_ERROR: 9994, //服务器错误
  // PARAMS_INVALID: 9995, //上传参数异常
  // CONTENT_TYPE_ERR: 9996, //ContentType错误
  // API_UN_IMPL: 9997, //功能尚未实现
  // SERVER_BUSY: 9998, //服务器繁忙
  // FAIL: 9999, //操作失败
  // SUCCESS: 10000 //操作成功
}

// 使用qs序列化参数params参数 -> 用于GET请求携带参数
http.defaults.paramsSerializer = function (params) {
  return qs.stringify(params)
}

// 在发送前再次对参数进行qs序列化处理
// http.defaults.transformRequest = [function (data) {
//     return qs.stringify(data, {arrayFormat: 'repeat'});
// }];

export default (router) => {
  // 请求拦截处理
  http.interceptors.request.use(
    (config) => {
      // 提交的时候携带登录凭证
      let userStore = useUserStore()
      let token = userStore.getToken() // 从store中获取token

      if (token) {
        // token存在,则添加到所有'Authorization'请求头,格式为' Bearer ' + token
        config.headers['token'] = token
      }
      // 根据unType上传类型,设置不同'Content-Type'头
      if (config.upType === http.upType.json) {
        config.headers['Content-Type'] = 'application/json;charset=UTF-8'
      } else if (config.upType === http.upType.file) {
        config.headers['Content-Type'] = 'multipart/form-data'
      } else if (config.upType === http.upType.stream) {
        config.headers['Content-Type'] = 'application/octet-stream'
      } else {
        config.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
        // 如果为该请求头,则序列化'config.data'
        if (config.data) {
          config.data = qs.stringify(config.data, { arrayFormat: 'repeat' })
        }
      }
      return config
    },
    (error) => {
      return Promise.error(error)
    }
  )
  // 响应拦截处理
  http.interceptors.response.use(
    async (response) => {
      // HTTP响应状态码正常
      if (response.status === 200) {
        // 如果响应内容中存在code字段
        if ('code' in response.data) {
          let userStore = useUserStore()
          const data = response.data
          // 检查code字段
          switch (data.code) {
            case http.httpcode.SUCCESS:
              // 将数据继续传递下去,返回响应体
              return Promise.resolve(data)
            case http.httpcode.FAIL:
              if (data.msg === 'NULLtoken') ElMessage.error('未登录,无法进行此操作')
              return Promise.reject(data)
            // case http.httpcode.FORBIDDEN:
            //   // 权限不足
            //   ElMessage.error('权限不够，请联系管理员')
            //   // 将数据继续传递下去
            //   return Promise.reject(data)
            // case http.httpcode.UNAUTHORIZED:
            //   // 判断是否是超时
            //   if (typeof data.data === 'string' && data.data.indexOf('Jwt expired at') >= 0) {
            //     //刷新凭证
            //     await store.reloadToken()
            //     //设置为未加载
            //     store.setLoaded(false)
            //     //跳转到主页
            //     router.push('/home')
            //   } else {
            //     //没有登录或登录已失效
            //     router.push('/')
            //     //重置数据
            //     store.resetSaveData()
            //   }
            //   //将数据继续传递下去
            //   return Promise.reject(data)
            // case http.httpcode.NOT_FOUND:
            //   ElMessage.warning(data.message || '404访问页面不存在')
            //   return Promise.reject(data)
            // case http.httpcode.CONTENT_TYPE_ERR:
            // case http.httpcode.PARAMS_INVALID:
            //   ElMessage.warning(data.message || '请求参数或请求头错误')
            //   return Promise.reject(response)
            default:
              return Promise.reject(response)
          }
        }
        return Promise.resolve(response)
      } else if (response.status === 404) {
        ElMessage.warning('404访问页面不存在')
        // 使用resolve传的内容会被.then捕获
        return Promise.resolve(response)
      } else {
        // 使用reject传的内容会被.catch捕获
        return Promise.reject(response)
      }
    },
    (error) => {
      if (error.code === 'ECONNABORTED' || error.code === 'ERR_NETWORK') ElMessage.error('连接服务器失败!!!')
      router.push('/')
      return Promise.reject(error)
    }
  )
}
